/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.debug.pyunit;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.python.pydev.core.ICompletionCache;
import org.python.pydev.core.IDefinition;
import org.python.pydev.core.IModule;
import org.python.pydev.core.log.Log;
import org.python.pydev.editor.actions.PyOpenAction;
import org.python.pydev.editor.codecompletion.revisited.CompletionCache;
import org.python.pydev.editor.codecompletion.revisited.CompletionStateFactory;
import org.python.pydev.editor.codecompletion.revisited.visitors.Definition;
import org.python.pydev.editor.model.ItemPointer;
import org.python.pydev.editor.refactoring.PyRefactoringFindDefinition;
import org.python.pydev.editorinput.PySourceLocatorBase;
import org.python.pydev.parser.fastparser.FastDefinitionsParser;
import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.visitors.NodeUtils;
import org.python.pydev.plugin.nature.PythonNature;
import com.aptana.shared_core.io.FileUtils;
import com.aptana.shared_core.string.FastStringBuffer;
public class PyUnitTestResult {
public final String status;
public final String location;
public final String test;
public final String capturedOutput;
public final String errorContents;
public final String time;
private WeakReference<PyUnitTestRun> testRun;
public final String STATUS_OK = "ok";
public final String STATUS_FAIL = "fail";
public final String STATUS_ERROR = "error";
public final String index;
public PyUnitTestResult(PyUnitTestRun testRun, String status, String location, String test, String capturedOutput,
String errorContents, String time) {
//note that the parent has a strong reference to the children.
this.testRun = new WeakReference<PyUnitTestRun>(testRun);
this.status = status;
this.location = location;
this.test = test;
this.capturedOutput = capturedOutput;
this.errorContents = errorContents;
this.time = time;
this.index = testRun.getNextTestIndex();
}
public PyUnitTestRun getTestRun() {
return this.testRun.get();
}
public boolean isOk() {
return STATUS_OK.equals(this.status);
}
/**
* Note that this string is used for the tooltip in the tree (so, be careful when changing it, as the information
* presentation is based on its format to add a different formatting).
*/
@Override
public String toString() {
int fixedContentsLen = 50;
FastStringBuffer buf = new FastStringBuffer(this.test.length() + this.status.length() + this.time.length()
+ this.location.length() + this.errorContents.length() + this.capturedOutput.length()
+ fixedContentsLen);
return buf.append(this.test).append(" Status: ").append(this.status).append(" Time: ").append(this.time)
.append("\n\n").append("File: ").append(this.location).append("\n\n").append(this.errorContents)
.append("\n\n").append(this.capturedOutput).append("\n\n").toString();
}
public void open() {
File file = new File(this.location);
if (file.exists()) {
PyOpenAction openAction = new PyOpenAction();
String fileContents = FileUtils.getFileContents(file);
ItemPointer itemPointer = getItemPointer(file, fileContents, this.test);
openAction.run(itemPointer);
}
}
public static ItemPointer getItemPointer(File file, String fileContents, String testPath) {
SimpleNode testNode = null;
if (fileContents != null) {
SimpleNode node = FastDefinitionsParser.parse(fileContents, "");
if (testPath != null && testPath.length() > 0) {
testNode = NodeUtils.getNodeFromPath(node, testPath);
}
}
ItemPointer itemPointer;
if (testNode != null) {
itemPointer = new ItemPointer(file, testNode);
} else {
//Ok, it's not defined directly here (it's probably in a superclass), so, let's go on and
//do an actual (more costly) find definition.
try {
PySourceLocatorBase locator = new PySourceLocatorBase();
IFile workspaceFile = locator.getWorkspaceFile(file);
if (workspaceFile != null && workspaceFile.exists()) {
IProject project = workspaceFile.getProject();
if (project != null && project.exists()) {
PythonNature nature = PythonNature.getPythonNature(project);
String moduleName = nature.resolveModule(file);
if (moduleName != null) {
IModule mod = nature.getAstManager().getModule(moduleName, nature, true);
if (mod != null) {
ICompletionCache completionCache = new CompletionCache();
IDefinition[] definitions = mod.findDefinition(CompletionStateFactory
.getEmptyCompletionState(testPath, nature, completionCache), -1, -1, nature);
if (definitions != null && definitions.length > 0) {
List<ItemPointer> pointers = new ArrayList<ItemPointer>();
PyRefactoringFindDefinition.getAsPointers(pointers, (Definition[]) definitions);
if (pointers.size() > 0) {
return pointers.get(0);
}
}
}
}
}
}
} catch (Exception e) {
Log.log(e);
}
//if we couldn't actually get the definition line, at least open the file we had (although that may not really
//be the place where it's defined if it's a test in a superclass).
itemPointer = new ItemPointer(file);
}
return itemPointer;
}
}